﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Windows.Forms;
using System.Text.RegularExpressions;
using System.IO;

namespace Cataloger
{
    public partial class FrmWyszukiwarka : Form
    {
		#region Fields (4) 

        FrmGlowna fGlowna;
        private ListViewColumnSorter lvwColumnSorter;
        UstawieniaWyszukiwania ustWyszukiwania;
        Wyszukiwarka wyszukiwar;

		#endregion Fields 

		#region Constructors (1) 

        public FrmWyszukiwarka(FrmGlowna formaGlowna)
        {
            fGlowna = formaGlowna;
            InitializeComponent();
            lvwColumnSorter = new ListViewColumnSorter();
            this.listView1.ListViewItemSorter = lvwColumnSorter;
            Katalogi.WyswietlWszystkieKatalogi(Katalog.WczytaneKatalogi, treeView1);
            //foreach (TreeNode tn in treeView1.Nodes)
            //{
            //    tn.Checked = true;
            //    tn.ZaznaczRekurenycjnie();
            //}
            GlowneListView.NaglowkiKolumnKatalog(listView1);
            cmbKategoria.Items.AddRange(Kategoria.KategorieDostepne.ToArray());
            wyszukiwar = new Wyszukiwarka();
        }

		#endregion Constructors 

		#region Properties (1) 

		#endregion Properties 

		#region Methods (21) 

		// Public Methods (1) 

        public void WyswietlWyniki()
        {
          
            GlowneListView.NaglowkiKolumnKatalog(listView1);
            listView1.BeginUpdate();
         
            try
            {
                foreach (Plik p in wyszukiwar.PlikiZnal)
                {
                    try
                    {
                       p.ShowListViewFileInfo(listView1);
                    }
                    catch { }
                }
            }
            catch { }
            try
            {
                foreach (ArchiwumEntry ae in wyszukiwar.ArchiwaZnal)
                {
                    try
                    {
                        ae.ShowAEListView(listView1);
                        
                    }
                    catch { }
                }

            }
            catch { }
                    toolStripStatusLabel1.Text = "Znaleziono " + wyszukiwar.PlikiZnal.Count.ToString() + " plików oraz " + wyszukiwar.ArchiwaZnal.Count.ToString() + " plików w archiwach";
                                
                listView1.EndUpdate();  
            
        }
		// Private Methods (20) 

        private void bckWorkerSzukaj_DoWork(object sender, System.ComponentModel.DoWorkEventArgs e)
        {
            wyszukiwar.Szukaj(ustWyszukiwania);
            
            
        }

        private void bckWorkerSzukaj_RunWorkerCompleted(object sender, System.ComponentModel.RunWorkerCompletedEventArgs e)
        {

            WyswietlWyniki();
            btnSzukaj.Enabled = true;
        }

        private void btnSzukaj_Click(object sender, EventArgs e)
        {
            Kategoria katTemp=null;
            try
            {
                katTemp = (Kategoria)this.cmbKategoria.SelectedItem;
            }
            catch { }

            long rozmiarOd = 0;
            try
            {
                rozmiarOd = FrmKategorieDyn.PrzeliczNaBajty((int)numericUpDown1.Value, comboBox3.SelectedItem.ToString());

            }
            catch { }

            long rozmiarDo = 0;
            try
            {
                rozmiarDo = FrmKategorieDyn.PrzeliczNaBajty((int)numericUpDown2.Value, comboBox4.SelectedItem.ToString());
            }
            catch { }

            ustWyszukiwania = new UstawieniaWyszukiwania
                (this.chckSzukajData.Checked,
                this.dateTimePicker1.Value,
                this.dateTimePicker2.Value,
                katTemp,
                this.metodaSzukania(),
                rozmiarOd,
                rozmiarDo,
                this.chckSzukajOpis.Checked,
                this.chckSzukajRozmiar.Checked,
                this.chckArchiwa.Checked,
                this.szukanaData(),
                this.chckCaseSens.Checked,
                this.txtNazwa.Text,
                this.PobierzZaznaczoneFoldery(),
                this.chckKategoria.Checked,
                this.chckSzukajWyniki.Checked

                );

            listView1.Items.Clear();
            btnSzukaj.Enabled = false;
            bckWorkerSzukaj.RunWorkerAsync();

            
            
          
        }

        private void button2_Click(object sender, EventArgs e)
        {
            this.Close();
        }

        private void button3_Click_2(object sender, EventArgs e)
        {
            foreach (ColumnHeader cH in listView1.Columns)
            {
                cH.AutoResize(ColumnHeaderAutoResizeStyle.ColumnContent);
            }
        }

        private void chckKategoria_CheckedChanged(object sender, EventArgs e)
        {
            if (chckKategoria.Checked)
                cmbKategoria.Enabled = true;
            else
                cmbKategoria.Enabled = false;
                
        }

        private void chckSzukajData_CheckedChanged(object sender, EventArgs e)
        {
            if (chckSzukajData.Checked)
            {
               pnlData.Enabled = true;
            }
            else
            {
                pnlData.Enabled = false;
            }
        }

        private void chckSzukajRozmiar_CheckedChanged(object sender, EventArgs e)
        {
            if (chckSzukajRozmiar.Checked)
            {
                pnlRozmiar.Enabled = true;
            }
            else
            {
                pnlRozmiar.Enabled = false;
            }
        }

        private void cntxMenuWyszukanePliki_Opening(object sender, System.ComponentModel.CancelEventArgs e)
        {

        }

        private void listView1_ColumnClick(object sender, ColumnClickEventArgs e)
        {

            // Determine if clicked column is already the column that is being sorted.
            if (e.Column == lvwColumnSorter.SortColumn)
            {
                // Reverse the current sort direction for this column.
                if (lvwColumnSorter.Order == SortOrder.Ascending)
                {
                    lvwColumnSorter.Order = SortOrder.Descending;
                }
                else
                {
                    lvwColumnSorter.Order = SortOrder.Ascending;
                }
            }
            else
            {
                // Set the column number that is to be sorted; default to ascending.
                lvwColumnSorter.SortColumn = e.Column;
                lvwColumnSorter.Order = SortOrder.Ascending;
            }

            // Perform the sort with these new sort options.
            this.listView1.Sort();
        }

        private MetodaWyszukiwania metodaSzukania()
        {
            if (rbtnDokladnie.Checked)
                return MetodaWyszukiwania.Dokladne;
            else if (rbtnZawiera.Checked)
                return MetodaWyszukiwania.Zawiera;
            else if (rbtnRegExp.Checked)
                return MetodaWyszukiwania.RegEx;
            else
                return MetodaWyszukiwania.Zawiera;
        }

        //private void odznaczRek(TreeNode tn)
        //{
        //    foreach (TreeNode trn in tn.Nodes)
        //    {
        //        trn.Checked = false;
        //        odznaczRek(trn);
        //    }
        //}
        //private void zaznaczRek(TreeNode tn)
        //{
        //    foreach (TreeNode trn in tn.Nodes)
        //    {
        //        trn.Checked = true;
        //        zaznaczRek(trn);
        //    }
        //}
        private void otwórzFolderRodzicToolStripMenuItem_Click(object sender, EventArgs e)
        {
            Plik p = (Plik)listView1.SelectedItems[0].Tag;
            if (!p.UruchomFolder())
            {
                MessageBox.Show("Nośnik nie podłączony", p.Nosnik.NazwaAlias + p.Nosnik.Etykieta);

            }

        }

        private void otwórzZewnętrznieToolStripMenuItem_Click(object sender, EventArgs e)
        {
            try
            {
                Plik p = (Plik)listView1.SelectedItems[0].Tag;
                if (!p.Uruchom())
                {
                    MessageBox.Show("Nośnik nie podłączony", p.Nosnik.NazwaAlias + p.Nosnik.Etykieta);

                }
            }
            catch
            {
                //TODO: Zrobic obsluge tej funkcji dla plików w archiwach
                try
                {
                    ArchiwumEntry ae = (ArchiwumEntry)listView1.SelectedItems[0].Tag;

                    MessageBox.Show("Na razie nie dziala dla plików w archiwach");
                }
                catch { }
            }
        }

        private List<Folder> PobierzZaznaczoneFoldery()
        { List<Folder> listaFold = new List<Folder>();
            foreach (TreeNode tn in treeView1.Nodes)
            {
               
                if (tn.Checked)
                {
                    try
                    {
                        Folder temp = (Folder)tn.Tag;
                        listaFold.Add(temp);
                    }
                    catch
                    {
                        try
                        {
                            Nosnik temp = (Nosnik)tn.Tag;
                            listaFold.Add(temp.Root);
                        }
                        catch { }
                    }
                   

                }
                szukajDalej(tn,listaFold);
            }
            return listaFold;
        }

        private void pokażWKataloguToolStripMenuItem_Click(object sender, EventArgs e)
        {
            listView1.PokazPlikwKatalogu(fGlowna);
        }



        private void PrzeszukajFolder(Folder f)
        {
            foreach (Plik p in f.Pliki)
            {
                if (p.Nazwa.ToLower().Contains(txtNazwa.Text))
                {
                    p.ShowListViewFileInfo(listView1);
                }
            }
            foreach (Folder fold in f.Podflodery)
            {
                PrzeszukajFolder(fold);
            }
        }

        private void przydzielKategorięToolStripMenuItem_Click(object sender, EventArgs e)
        {
            if (listView1.SelectedItems.Count > 1)
            {
                FrmWybKategorii fWKat = new FrmWybKategorii();
                if (fWKat.ShowDialog() == DialogResult.OK)
                {

                    List<Plik> Pliki = new List<Plik>();
                    foreach (ListViewItem lst in listView1.SelectedItems)
                    {
                        Pliki.Add((Plik)lst.Tag);
                    }
                    foreach (Plik p in Pliki)
                    {
                        p.Kategoria = fWKat.Kategor;
                    }


                }
            }

            else if (listView1.SelectedItems.Count == 1)
            {
                try
                {
                    Plik p = (Plik)listView1.SelectedItems[0].Tag;
                    FrmWybKategorii fWKat = new FrmWybKategorii(p);
                    if (fWKat.ShowDialog() == DialogResult.OK)
                    {

                        p.Kategoria = fWKat.Kategor;

                    }
                }
                catch {}
            }
        }

        private void szukajDalej(TreeNode trnode,List<Folder> folderyZ)
        {
            foreach (TreeNode tn in trnode.Nodes)
            {
                if (tn.Checked)
                {
                    try
                    {
                        Folder temp = (Folder)tn.Tag;
                        folderyZ.Add(temp);
                    }
                    catch
                    {
                        try
                        {
                            Nosnik temp = (Nosnik)tn.Tag;
                            folderyZ.Add(temp.Root);
                        }
                        catch { }
                    }


                }
                szukajDalej(tn,folderyZ);
            }
        }

        private RodzajDaty szukanaData()
        {try{
            if (comboBox2.SelectedItem.ToString() == "Utworzenia")
                return RodzajDaty.Utworzenia;
            else if (comboBox2.SelectedItem.ToString() == "Modyfikacji")
                return RodzajDaty.Modyfikacji;
            else if (comboBox2.SelectedItem.ToString() == "OstatniegoDostępu")
                return RodzajDaty.Dostepu;
            else 
                return RodzajDaty.Brak;
        }
        catch { return RodzajDaty.Brak; }
               

        }

        private void treeView1_AfterCheck(object sender, TreeViewEventArgs e)
        {
            if (e.Node.Checked)
            {
                e.Node.ZaznaczRekurenycjnie();
            }
            else
            {
                e.Node.OdznaczRekurenycjnie();
            }
        }

		#endregion Methods 
    }




}
